package com.young.service.imp;

import com.young.dao.UserDao;
import com.young.dao.ValidateCodeDao;
import com.young.entity.User;
import com.young.entity.ValidateCode;
import com.young.exception.ValidateCodeExpiredException;
import com.young.service.UserService;
import com.young.tool.QQMailTool;
import com.young.tool.UploadImgTool;
import com.young.tool.ValidateCodeTool;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import java.util.Date;

/**
 * 描述:
 *
 * @author BluceYoung
 * @create 2020-12-02 19:53
 * B站：TeacherYoung凌风
 * www.teacheryoung.com
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;
    @Autowired
    ValidateCodeDao validateCodeDao;

    @Autowired
    QQMailTool qqMailTool;

    @Override
    public boolean register(User user) throws MessagingException {
        //TODO:验证邮箱是否可用
        //1.往user表里插入一条
        //插入之前给密码加密
        String md5Pwd = DigestUtils.md5Hex(user.getPwd());
        user.setPwd(md5Pwd);
        userDao.insert(user);
        //2.生成验证码
        String code = ValidateCodeTool.generateCode();
        //3.往验证码表里插入一条
        ValidateCode validateCode=new ValidateCode();
        validateCode.setUserId(user.getId());
        validateCode.setCode(code);
        validateCodeDao.insert(validateCode);
        //4.发邮件
//        qqMailTool.sendMail(user.getLoginMail(),
//                "欢迎注册青青社团",
//                "您的验证码是"+code+"，请在20分钟内激活。");
        return true;
    }

    @Override
    public User login(String loginMail, String pwd) {
        User user=new User();
        user.setLoginMail(loginMail);
        user.setPwd(DigestUtils.md5Hex(pwd));
        //查询
        User userResult = userDao.get(user);
        if(userResult!=null && userResult.getStatus()>0){
            //更新上次登录时间
            userResult.setLastTime(new Date());
            userDao.update(userResult);
        }
        return userResult;
    }

    /**
     * 新用户激活
     *
     * @param userId 用户编号
     * @param code   验证码
     * @return true：激活成功，false验证码错误，异常：验证码过期
     * @throws ValidateCodeExpiredException 验证码过期抛出异常
     */
    @Override
    public boolean active(Long userId, String code) throws ValidateCodeExpiredException {
        //1.根据用户编号查询验证码信息
        ValidateCode validateCode = validateCodeDao.get(userId);
        //2.判定验证码是否过期
        //2.1过期了，重新生成验证码并发邮件
        Date expiredTime = validateCode.getExpiredTime();
        Date now=new Date();
        //2.2没过期，判定code是否正确
        if(expiredTime.getTime()<now.getTime()){//过期了
            //重新生成验证码，并发邮件
            String newCode = ValidateCodeTool.generateCode();
            //更新验证码
            validateCode.setCode(newCode);
            validateCodeDao.update(validateCode);
            //TODO:上线时取消注释：发邮件
//          qqMailTool.sendMail(user.getLoginMail(),
//                "欢迎注册青青社团",
//                "您的验证码是"+newCode+"，请在20分钟内激活。");
            throw new ValidateCodeExpiredException("验证码失效，已重新发送验证邮件，请重新登录邮箱查看。");
        }else{//没过期
            if(validateCode.getCode().equals(code)){
                //更新用户状态
                //先查询旧数据
                User userCondition=new User();
                userCondition.setId(userId);
                User user = userDao.get(userCondition);
                user.setStatus(1);
                userDao.update(user);//更新数据
                return true;
            }
            return false;
        }
    }

    /**
     * 修改个人资料
     *
     * @param user
     * @return
     */
    @Override
    public boolean modify(User user) {
        user.setUpdateTime(new Date());//把更新时间调成当前
        userDao.update(user);
        return true;
    }

    /**
     * 上传用户头像
     *
     * @param userId  用户编号
     * @param imgData 图像数据(Base64编码的字符串)
     * @param savePath 存储的路径（绝对路径）
     * @return
     */
    @Override
    public String uploadHead(Long userId, String imgData,String savePath) {
        //1.头像存盘
        UploadImgTool.generateImg(imgData,savePath,userId+".jpg");
        //2.修改数据库头像路径
        User user=new User();
        user.setId(userId);
        String imgPath=userId+".jpg?r="+(new Date()).getTime();
        user.setHeadImg(imgPath);
        userDao.update(user);
        return imgPath;
    }

    /**
     * 查询一个特定的用户信息
     *
     * @param user 查询条件
     * @return
     */
    @Override
    public User get(User user) {
        user.setStatus(1);//只查正常用户，没有激活或被封的账户不查
        User result = userDao.get(user);
        return result;
    }


}
